package com.ceres.customer.service.impl;

import com.ceres.customer.dao.CustRoleMapper;
import com.ceres.customer.dao.CustUserMapper;
import com.ceres.customer.pojo.Menu;
import com.ceres.customer.pojo.Role;
import com.ceres.customer.service.CustRoleService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

@Service
public class CustRoleServiceImpl implements CustRoleService {

    @Autowired
    private CustRoleMapper custRoleMapper;

    @Autowired
    private CustUserMapper custUserMapper;


    /**
     * 角色添加方法
     *
     * @param role
     */
    @Override
    public void add(Role role, Integer[] permissionIds, Integer[] menuIds) {
        //添加角色信息
        //默认为平台角色
        role.setCategory("1");
        custRoleMapper.insertSelective(role);
        for (int permissionId : permissionIds) {
            //将角色信息与权限信息存到关联表中
            custRoleMapper.setRoleMenu(role.getId(), permissionId);
        }
        for (int menuId : menuIds) {
            //将角色信息与菜单信息存到关联表中
            custRoleMapper.setRoleMenu(role.getId(), menuId);
        }
    }

    /**
     * 角色修改方法
     *
     * @param role
     */
    @Override
    public void update(Role role, Integer[] permissionIds, Integer[] menuIds) {
        //先修改角色信息
        custRoleMapper.updateByPrimaryKey(role);
        //删除角色权限关联信息
        for (Integer permissionId : permissionIds) {
            custRoleMapper.deleteRoleMenuByRid(permissionId);
        }
        //删除角色菜单关联信息
        for (Integer menuId : menuIds) {
            custRoleMapper.deleteRoleMenuByRid(menuId);
        }
        //最后将新的关联信息添加到关联表中
        for (int permissionId : permissionIds) {
            //将角色信息与权限信息存到关联表中
            custRoleMapper.setRoleMenu(role.getId(), permissionId);
        }
        for (int menuId : menuIds) {
            //将角色信息与菜单信息存到关联表中
            custRoleMapper.setRoleMenu(role.getId(), menuId);
        }
    }

    /**
     * 角色删除方法
     *
     * @param id
     */
    @Override
    public void delete(int id) {
        //查询该角色是否有用户使用
        List list = custUserMapper.findByUserId(id);
        if (list.size() > 0) {
            //有用户使用
            throw new RuntimeException("有用户使用该角色");
        }
        //先删除角色表
        custRoleMapper.deleteByPrimaryKey(id);
        //再删除角色权限关联表
        custRoleMapper.deleteRoleMenuByRid(id);
    }

    /**
     * 分页模糊查询
     *
     * @param keyword
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public Page findPage(String keyword, int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return (Page<Role>)  custRoleMapper.findByKeyWord(keyword);
    }

    /**
     * 通过角色id查询
     *
     * @param id
     * @return
     */
    @Override
    public Role findById(int id) {
        //根据角色id获取角色信息
        Role role = custRoleMapper.selectByPrimaryKey(id);
        //根据角色id在关联表中获取相关的权限信息集合
        Set<Menu> permissions = custRoleMapper.getPermByRoleId(id);
        //将权限集合封装进角色实体中
        role.setPermissions(permissions);
        //根据角色id在关联表中获取相关的菜单信息集合
        LinkedHashSet<Menu> menus = custRoleMapper.getMenuByRoleId(id);
        //将角色集合封装进角色实体中
        role.setMenus(menus);
        return role;
    }

    /**
     * 查询所有角色信息
     *
     * @return
     */
    @Override
    public List<Role> findAll() {
        return custRoleMapper.findAll();
    }

    /**
     * 根据用户id获取对应角色
     * @param id
     * @return
     */
    @Override
    public List<Role> findByUserId(int id) {
        return custRoleMapper.findRoleByUserId(id);
    }
}
